home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagg_m.zip / KEYBOARD.SWG / 0073_Checking Keys begin Held.pas < prev    next >
Pascal/Delphi Source File  |  1994-02-03  |  2KB  |  83 lines

  1.  
  2. UNIT MultiKey;
  3.  
  4. INTERFACE
  5.  
  6. VAR
  7.   KeyStat : Array[1..127] OF ShortInt;
  8.   { 0 (not physically down)
  9.     1 (that sucker's down)
  10.    -1 (it's being held, don't repeat) }
  11.  
  12. PROCEDURE EnableMultiKey;
  13. PROCEDURE DisableMultiKey;
  14.  
  15. IMPLEMENTATION
  16.  
  17. USES Dos;
  18.  
  19. VAR
  20.   OldKbdInt       : Pointer;
  21.   OldCtrlBreakInt : Pointer;
  22.   OldKeyExitProc  : Pointer;
  23.  
  24. PROCEDURE ClearKeyValues;
  25. VAR
  26.   keyclearcounter : Byte;
  27. BEGIN
  28.   FOR keyclearcounter := 1 TO 127 DO KeyStat[keyclearcounter] := 0;
  29. END;
  30.  
  31. PROCEDURE NewKeyExitProc; Far;
  32. BEGIN
  33.   SetIntVec($09, OldKbdInt);
  34.   SetIntVec($1B, OldCtrlBreakInt);
  35.   ExitProc := OldKeyExitProc;
  36. END;
  37.  
  38. PROCEDURE NewCtrlBreakInt; Interrupt;
  39. { it is important that the new Ctrl-Break handler does *nothing* }
  40. BEGIN
  41. END;
  42.  
  43. PROCEDURE NewKbdInt; Interrupt;
  44. VAR
  45.   p60 : Byte;
  46. BEGIN
  47.   p60 := Port[$60];
  48.   Port[$61] := Port[$61] OR 128;         {/ keyboard    \}
  49.   Port[$61] := Port[$61] AND (NOT 128);  {\ acknowledge /}
  50.   IF (p60 > 0) THEN BEGIN
  51.     IF (p60 > 127) THEN
  52.       KeyStat[p60 AND 127] := 0
  53.     ELSE
  54.       IF (KeyStat[p60] = 0) THEN Inc(KeyStat[p60]);
  55.   END;
  56.   ASM CLI; END;                           {disable hardware ints}
  57.   MemW[$0040:$001A] := MemW[$0040:$001C]; {clear buffer}
  58.   ASM STI; END;                           {restore hardware ints}
  59.   Port[$20] := $20;                       { send EOI to PIC }
  60. END;
  61.  
  62. PROCEDURE EnableMultiKey;
  63. BEGIN
  64.   SetIntVec($09, Addr(NewKbdInt));
  65. END;
  66.  
  67. PROCEDURE DisableMultiKey;
  68. BEGIN
  69.   SetIntVec($09, OldKbdInt);
  70. END;
  71.  
  72.  
  73. BEGIN  { unit initialization }
  74.   GetIntVec($1B, OldCtrlBreakInt);
  75.   SetIntVec($1B, Addr(NewCtrlBreakInt));
  76.   ClearKeyValues;
  77.   OldKeyExitProc := ExitProc;
  78.   ExitProc := Addr(NewKeyExitProc);
  79.   GetIntVec($09, OldKbdInt);
  80.   EnableMultiKey;
  81. END.
  82.  
  83.